import numpy as np
from scipy import stats
import seaborn as sns
import numpy.random as npr
import matplotlib

matplotlib.use(backend="TkAgg")
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

'''这段代码主要是 演示「绝对连续分布」与其「概率密度函数（PDF）」之间的关系，
并且验证了 CDF 的导数是 PDF、PDF 的积分是 1，还利用微元 f(x)dx 近似概率来说明真实世界计算中的近似意义。
'''
'''
| 代码模块                  | 作用                   | 对应的概率论概念                               |
| --------------------- | -------------------- | -------------------------------------- |
| 多种分布（正态/指数/Beta/混合正态） | 展示典型**绝对连续分布**       | 满足 (F(x)=\int_{-\infty}^x f(t),dt)     |
| 绘制 PDF / CDF          | 可视化**密度**和**累积分布函数** | (f(x) = F'(x))                         |
| 验证积分是否为 1             | 检查 PDF 是否规范化         | (\int_{-\infty}^{+\infty} f(x),dx = 1) |
| 概率微元 (f(x),dx) 演示     | 展示小区间概率近似            | (P(x \le X < x+dx) \approx f(x),dx)    |

'''
# 演示绝对连续分布和概率密度函数
plt.figure(figsize=(15, 10))

# 创建几个不同的绝对连续分布
distributions = [
    ('正态分布', stats.norm(0, 1)),
    ('指数分布', stats.expon(scale=1)),
    ('Beta分布', stats.beta(2, 5)),
    ('混合正态分布', None)  # 自定义混合分布
]

x_common = np.linspace(-3, 3, 1000)

for i, (name, dist) in enumerate(distributions):
    plt.subplot(2, 4, i + 1)

    if name == '混合正态分布':
        # 创建混合正态分布
        def mixed_pdf(x):
            return 0.7 * stats.norm(-1, 0.5).pdf(x) + 0.3 * stats.norm(1, 0.8).pdf(x)


        def mixed_cdf(x):
            return 0.7 * stats.norm(-1, 0.5).cdf(x) + 0.3 * stats.norm(1, 0.8).cdf(x)


        pdf_vals = mixed_pdf(x_common)
        cdf_vals = mixed_cdf(x_common)
    else:
        pdf_vals = dist.pdf(x_common)
        cdf_vals = dist.cdf(x_common)

    # 绘制PDF
    plt.plot(x_common, pdf_vals, 'b-', linewidth=2, label='概率密度函数 f(x)')
    plt.fill_between(x_common, pdf_vals, alpha=0.3, color='blue')
    plt.xlabel('x')
    plt.ylabel('f(x)')
    plt.title(f'{name}的PDF')
    plt.grid(True, alpha=0.3)

    plt.subplot(2, 4, i + 5)

    # 绘制CDF
    plt.plot(x_common, cdf_vals, 'r-', linewidth=2, label='分布函数 F(x)')
    plt.xlabel('x')
    plt.ylabel('F(x)')
    plt.title(f'{name}的CDF')
    plt.grid(True, alpha=0.3)

    # 验证绝对连续性质
    if name == '混合正态分布':
        # 数值验证积分
        dx = x_common[1] - x_common[0]
        integral = np.sum(pdf_vals) * dx
        print(f"{name}: ∫f(x)dx ≈ {integral:.6f}, F(+∞)-F(-∞) = {mixed_cdf(np.inf) - mixed_cdf(-np.inf):.6f}")
    else:
        print(f"{name}: ∫f(x)dx = 1.000000, F(+∞)-F(-∞) = {dist.cdf(np.inf) - dist.cdf(-np.inf):.6f}")

plt.tight_layout()
plt.show()

# 演示概率微元的概念
print("\n概率微元演示:")
x_point = 0
dx = 0.01
normal_dist = stats.norm(0, 1)

# 计算在x_point附近微小区间内的概率
prob_interval = normal_dist.cdf(x_point + dx) - normal_dist.cdf(x_point)
prob_density = normal_dist.pdf(x_point) * dx

print(f"在区间 [{x_point}, {x_point + dx}] 内的概率:")
print(f"  精确计算: F({x_point + dx}) - F({x_point}) = {prob_interval:.6f}")
print(f"  近似计算: f({x_point}) * dx = {prob_density:.6f}")
print(f"  相对误差: {abs(prob_interval - prob_density) / prob_interval * 100:.4f}%")
